#include "ChannelMap.h"

// 初始化
struct ChannelMap *channelmapInit(int size)
{
    struct ChannelMap *map = (struct ChannelMap *)malloc(sizeof(struct ChannelMap));
    if (!map)
    {
        perror("malloc");
        return NULL;
    }
    map->size = size;
    map->list = (struct Channel **)calloc(size, sizeof(struct Channel *));
    if (!map->list)
    {
        free(map);
        perror("calloc");
        return NULL;
    }
    return map;
}

// 清空map
void channelMapClear(struct ChannelMap *map)
{
    if (map != NULL)
    {
        // 先去析构每一个变量里面的内容
        for (int i = 0; i < map->size; i++)
        {
            if (map->list[i] != NULL)
            {
                free(map->list[i]);
            }
        }
        // 再把map的list指针置空
        free(map->list);
        map->list = NULL;
    }
    map->size = 0;
}

// 扩容函数
bool makeMapRoom(struct ChannelMap *map, int newSize, int unitSize)
{
    if (map->size < newSize)
    {
        // 扩大一倍
        int cursize = map->size;
        while (cursize < newSize)
        {
            cursize = cursize * 2;
        }

        // realloc 有两种情况
        // 一种是空间够 不管
        // 另外一种是空间不够 返回的地址是返回空 ，需要你重新赋值
        struct Channel **addr = (struct Channel **)realloc(map->list, cursize * unitSize);
        if (addr == NULL)
        {
            return false;
        }
        map->list = addr;

        // 这句代码需要注意
        memset(&map->list[map->size], 0, (cursize - map->size) * sizeof(struct Channel *));
        // memset(map->list+map->size,0,(cursize-map->size)*unitSize);
        map->size = cursize;
    }
    return true;
}
